package Proyecto;

import java.util.ArrayList;


public class MonticuloBinario {

private ArrayList<Object[]> arreglo=new ArrayList();
private int nElementos=0;

public MonticuloBinario(){
    
}
public MonticuloBinario(ArrayList<Object[]> elems)
{
    for (int i = 0; i < elems.size(); i++) {
        Ingresar(elems.get(i));
    }
}

boolean EstaVacio()
{
    return(nElementos==0);
}

void Intercambiar(int i,int j)
{
    Object[] temporal=arreglo.get(i);
    Object[] temporal2=arreglo.get(j);
    arreglo.remove(i);
    arreglo.add(i, temporal2);
    arreglo.remove(j);
    arreglo.add(j, temporal);
}

void OrganizarMonticulo(int i)
{
    int izq=Izquierdo(i);
    int der=Derecho(i);
    int aux;
    if((izq<arreglo.size())&&((Integer)arreglo.get(izq)[0]<(Integer)arreglo.get(i)[0])){
        aux=izq;
    }
    else aux=i;
    if((der<arreglo.size())&&((Integer)arreglo.get(der)[0]<(Integer)arreglo.get(aux)[0])){
        aux=der;
    }
    if(aux!=i){
        Intercambiar(i,aux);
        OrganizarMonticulo(aux);
    }
}

Object[] ExtraerMin()
{
    Object[] minimo=null;
    if(nElementos>0)
    {
        minimo=arreglo.get(0);
        arreglo.remove(0);
        OrganizarMonticulo(0);    
        nElementos--;
    }
    return minimo;
}

Object[] RetornarMin()
{
    Object[] minimo=null;
    if(nElementos>0)
    {
        minimo=arreglo.get(0);      
    }
    return minimo;
}

void Ingresar(Object[] elem)
{   
//    arreglo.ensureCapacity(arreglo.size()+1);
    arreglo.add(elem);
    nElementos++;
    int i=arreglo.size()-1;
    while(i>0&&((Integer)arreglo.get(Padre(i))[0]>(Integer)arreglo.get(i)[0])){
        Intercambiar(i,Padre(i));
        i=Padre(i);
    }
}

int Padre(int i)
{   
    int resultado=0;
    if(i!=0){
    if((double)i/2==(int)i/2){
        resultado = ((int)i/2) - 1;
    }else
        resultado = (int) Math.floor(i/2);
    }
    return resultado;
}

int Izquierdo(int i)
{
   return (2*i)+1;
}

int Derecho(int i)
{
    return (2*i)+2;
}

void ImprimirMonticulo()
{
    String resultado = "";
    for (int i = 0; i < arreglo.size(); i++) {
        for (int j = 1; j < arreglo.get(i).length; j++) {
            resultado=resultado+(String.valueOf(arreglo.get(i)[j])+" ");            
        }        
    }
    System.out.println(resultado);
}
    
}

